/**
 * Clase que implementa la interfaz ISupermercado.
 * 
 * @author Grupo 3
 * @version 1.0
 */

@SuppressWarnings("rawtypes")
public class TSupermercado implements ISupermercado {
	ILista productosDelSupermercado = new TLista();

	@Override
	public ILista getProductosDelSupermercado() {
		return productosDelSupermercado;
	}

	@Override
	public void setProductosDelSupermercado(ILista productosDelSupermercado){
		this.productosDelSupermercado = productosDelSupermercado;
	}

	@Override
	public Boolean agregarProducto(IProducto unProducto) {


		if (unProducto != null && 
				((IElemento)productosDelSupermercado.buscar(unProducto.getCodigoBarra())) == null){
			
			IElemento elemAAgregar = new TElemento(unProducto.getCodigoBarra(), unProducto);
			return productosDelSupermercado.insertarAlPrincipio(elemAAgregar);
		}

		return false;
	}

	@Override
	public Boolean agregarStockProducto(Comparable unCodigoBarra,
			Integer unaCantidad) {

		if (unCodigoBarra != null && unaCantidad > 0){
			IElemento elemABuscar = productosDelSupermercado.buscar(unCodigoBarra);

			Integer stockActual = ((IProducto)elemABuscar.getDatos()).getStock(); 
			IProducto prodAux = (IProducto)elemABuscar.getDatos();

			prodAux.setStock(stockActual + unaCantidad);
			elemABuscar.setDato(prodAux);

			if (((IProducto)elemABuscar.getDatos()).getStock() == (stockActual + unaCantidad))
				return true;
		}

		return false;
	}

	@Override
	public IProducto eliminarProducto(Comparable unCodigoBarra) {

		if (unCodigoBarra != null){

			IElemento elemABorrar;
			elemABorrar = productosDelSupermercado.eliminar(unCodigoBarra);
			
			if(elemABorrar!=null)
				return (IProducto)elemABorrar.getDatos();
			else
				return null;
		}

		return null;

	}

	@Override
	public ILista listarProductoOrdenadoPorNombre() {
		ILista productoOrdenadosPorNombre = new TLista();

		IElemento elemActual = productosDelSupermercado.obtenerPrimero();

		while (elemActual != null){
			IElemento elemNombre = new TElemento(((IProducto)elemActual.getDatos()).getNombre(), 
					elemActual.getDatos());

			if (!productoOrdenadosPorNombre.insertarOrdenado(elemNombre))
				return null;

			elemActual = elemActual.getSiguiente();
			elemNombre = null;
		}

		return productoOrdenadosPorNombre;
	}

	@Override
	public String imprimirNombresDeProductos(){
		String resultado = "";

		IElemento elemActual = productosDelSupermercado.obtenerPrimero();
		while (elemActual != null){
			IProducto auxProducto = (IProducto)elemActual.getDatos();
			
			resultado += auxProducto.getNombre();
			
			elemActual = elemActual.getSiguiente();
			if (elemActual != null)
				resultado +=SEPARADOR_VALORES;
		    
		}
		return resultado;
	}
	
	public String imprimirProductos(){
		String resultado = "";

		IElemento elemActual = productosDelSupermercado.obtenerPrimero();
		while (elemActual != null){
			IProducto auxProducto = (IProducto)elemActual.getDatos();

			resultado += auxProducto.getCodigoBarra() + SEPARADOR_VALORES;
			resultado += auxProducto.getNombre() + SEPARADOR_VALORES;
			resultado += auxProducto.getPrecio() + SEPARADOR_VALORES;
			resultado += auxProducto.getStock() + SEPARADOR_ELEMENTOS;

			elemActual = elemActual.getSiguiente();
		}

		if (resultado.length() > 0)
			return resultado.substring(0, resultado.length() - 1);
		else
			return resultado;
	}

	@Override
	public String imprimirProducto(Comparable unCodigoBarra){
		String resultado = "";
		
		IElemento elemAImprimir = productosDelSupermercado.buscar(unCodigoBarra);
		if (elemAImprimir != null){
			IProducto auxProducto = (IProducto)elemAImprimir.getDatos();
			
			resultado += "Codigo de barras: "+auxProducto.getCodigoBarra() + SEPARADOR_VALORES+"\n";
			resultado += "Nombre: "+auxProducto.getNombre() + SEPARADOR_VALORES+"\n";
			resultado += "Precio: "+auxProducto.getPrecio() + SEPARADOR_VALORES+"\n";
			resultado +="Stock disponible: "+ auxProducto.getStock()+"\n";
		}
		
		return resultado;
		
	}
	@Override
	public Integer obtenerStock(){
		Integer stock = 0;

		IElemento elemActual = productosDelSupermercado.obtenerPrimero();
		while (elemActual != null){
			IProducto auxProducto = (IProducto)elemActual.getDatos();

			stock += auxProducto.getStock();
			
			elemActual = elemActual.getSiguiente();
		}

		return stock;
	}
	
	@Override
	public Boolean reducirStockProducto(Comparable unCodigoBarra,
			Integer unaCantidad) {

		if (unCodigoBarra != null && unaCantidad > 0){
			IElemento elemABuscar = productosDelSupermercado.buscar(unCodigoBarra);

			Integer stockActual = ((IProducto)elemABuscar.getDatos()).getStock();

			if (stockActual >= unaCantidad){
				IProducto prodAux = (IProducto)elemABuscar.getDatos();

				prodAux.setStock(stockActual - unaCantidad);
				elemABuscar.setDato(prodAux);

				if (((IProducto)elemABuscar.getDatos()).getStock() == (stockActual - unaCantidad))
					return true;		
			}
		}
		return false;
	}
}